import redis
import json
from typing import Optional, List
from app.utils.config import Settings

settings = Settings()

redis_client = redis.from_url(settings.kv_url)

class RedisStore:
    @staticmethod
    def save_clipboard(data: dict):
        """保存剪贴板数据，如果内容重复则更新时间戳"""
        # 获取最近的历史记录
        recent_data = redis_client.lrange("clipboard:list", 0, -1)
        
        # 检查是否存在相同内容
        for item in recent_data:
            item_dict = json.loads(item)
            if item_dict["content"] == data["content"]:
                # 如果内容相同，删除旧记录
                redis_client.lrem("clipboard:list", 1, item)
                break
        
        # 保存新记录
        redis_client.lpush("clipboard:list", json.dumps(data))
        # 设置过期时间（30天）
        redis_client.expire("clipboard:list", 30 * 24 * 60 * 60)

    @staticmethod
    def get_clipboard_history(page: int = 1, page_size: int = 20) -> dict:
        """获取剪贴板历史，支持分页
        
        Args:
            page: 页码，从1开始
            page_size: 每页记录数，默认20条
            
        Returns:
            dict: 包含分页信息和数据的字典
        """
        # 计算起始和结束索引
        start = (page - 1) * page_size
        end = start + page_size - 1
        
        # 获取总记录数
        total = redis_client.llen("clipboard:list")
        
        # 获取当前页的数据
        data = redis_client.lrange("clipboard:list", start, end)
        items = [json.loads(item) for item in data]
        
        return {
            "items": items,
            "total": total,
            "page": page,
            "page_size": page_size,
            "total_pages": (total + page_size - 1) // page_size
        }

    @staticmethod
    def get_latest_history(limit: int = 5) -> List[dict]:
        """获取最新的几条历史记录"""
        data = redis_client.lrange("clipboard:list", 0, limit - 1)
        return [json.loads(item) for item in data]

    @staticmethod
    def delete_clipboard(item_id: str) -> bool:
        """删除剪贴板内容"""
        data = RedisStore.get_clipboard_history()
        new_data = [item for item in data if item["id"] != item_id]
        
        # 清空并重新写入
        redis_client.delete("clipboard:list")
        for item in new_data:
            redis_client.lpush("clipboard:list", json.dumps(item))
        
        return True

    @staticmethod
    def clear_all_history() -> bool:
        """清除所有历史记录"""
        redis_client.delete("clipboard:list")
        return True

    @staticmethod
    def get_latest() -> Optional[dict]:
        """获取最新的剪贴板内容"""
        data = redis_client.lrange("clipboard:list", 0, 0)
        if not data:
            return None
        return json.loads(data[0])

    @staticmethod
    def add_clipboard(content: str, device_id: str) -> dict:
        """添加新的剪贴板内容"""
        from app.models.clipboard import ClipboardItem
        
        # 创建新的剪贴板项
        item = ClipboardItem(
            content=content,
            device_id=device_id
        )
        
        # 转换为字典并保存
        data = item.model_dump()
        RedisStore.save_clipboard(data)
        
        return data 